package src;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理主题角色：也叫做委托类或代理类。它负责对真实角色的应用，
 * 把所有抽象主题类定义的方法限制委托给真实主题角色实现，并且在具体主题角色处理完毕前后做预处理和善后处理工作。
 */
public class DynamicCglibProxy extends HuaWeiProxy {
    /**
     * 程序入口，一般为程序的调用者使用代理访问功能
     */
    public static void main(String[] args) {
        // 通过CGLIB动态代理获取代理对象的过程
        Enhancer enhancer = new Enhancer();
        // 设置enhancer对象的父类
        enhancer.setSuperclass(YonexImplSell.class);
        // 设置enhancer的回调对象
        enhancer.setCallback(new HuaWeiProxy());
        // 创建代理对象
        ISell proxySell = (ISell) enhancer.create();
        System.out.println(proxySell.sellGloves());
    }
}

class HuaWeiProxy implements MethodInterceptor {
    private  String COMMON_PEDDLE = "我是华为的cglib动态代理，";
    private  ISell sell; //真实对象，也就是被代理的的目标对象

    public HuaWeiProxy() {
        sell = new YonexImplSell();
    }

    /**
     * 拦截方法
     *
     * @param o           代理的目标对象
     * @param method      目标对象的方法
     * @param objects     参数
     * @param methodProxy CGlib方法代理对象
     * @return 代理方法返回值
     * @throws Throwable 异常
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        return COMMON_PEDDLE + methodProxy.invokeSuper(o, objects);
    }
}